iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Software Development

Laravel 隨筆學習札記系列 第 18

Day18 - Laravel Middleware:隱藏在應用背後的守護者

  • 分享至 

  • xImage
  •  

嗨嗨!今天想來了解的是 Laravel Middleware ,這在 Laravel 中做什麼呢?為什麼需要這個東東~


Laravel Middleware ?

先來看看官方網站怎麼說的勒

Introduction
Middleware provide a convenient mechanism for inspecting and
filtering HTTP requests entering your application. For example, Laravel
includes a middleware that verifies the user of your application is
authenticated. If the user is not authenticated, the middleware will
redirect the user to your application's login screen. However, if the
user is authenticated, the middleware will allow the request to proceed
further into the application.

Additional middleware can be written to perform a variety of tasks
besides authentication. For example, a logging middleware might log all
incoming requests to your application. A variety of middleware are
included in Laravel, including middleware for authentication and CSRF
protection; however, all user-defined middleware are typically located
in your application's app/Http/Middleware directory.

我理解的意思大概是,Middleware (中介軟體)就像是應用程式的檢查站,負責篩選進入的 HTTP 請求。像是 Laravel 有一個 Middleware (中介軟體)專門檢查使用者的身份。如果使用者還沒通過身份驗證,Middleware (中介軟體)會將畫面引導到登錄頁面;但如果使用者已經登入了,就會讓請求繼續進入應用程式。

當然,Middleware (中介軟體)可以做身份驗證, 還可以做其他事情。像是,有一種日誌 Middleware (中介軟體),它會記錄所有進入的請求,這樣就能隨時查看誰進來過。Laravel 包含了多種 Middleware (中介軟體),不僅限於身份驗證,還有一些用來防止 CSRF 攻擊的功能。我們自己創建的 Middleware (中介軟體),通常會放在應用程式的 app/Http/Middleware 資料夾裡。


在哪裡會看到 Laravel Middleware?

  • 身份驗證:確保使用者已經登入才能進入特定頁面或使用功能。
  • 日誌記錄:記錄所有進入應用程式的請求,可供之後查看以及分析。
  • CORS 處理:為所有回應添加適當的 CORS 標頭,讓其他網站能安全地請求你的資源,這樣應用程式就能安全地和其他網站互動。
  • 請求過濾:對進入的請求數據進行檢查,防止像 XSS 攻擊這類的安全問題。

Laravel 如何運作?

  1. 請求進來:當一個 HTTP 請求進入應用程式,Laravel 會先看看這個請求是不是需要經過某個 Middleware。
  2. 呼叫 Middleware:如果需要,Laravel 會使用該 Middleware 的 handle() 方法,我們可以選擇處理請求或返回回應。
  3. 決定下一步
    • 傳遞請求:Middleware 可以選擇把請求傳遞給下一個 Middleware 或者最終的路由。
    • 返回回應:如果不符合某些條件,Middleware 也可以直接給出回應,比如重定向或返回錯誤信息。

Defining Middleware

要創建一個新的 Middleware,使用 Artisan 命令中的 make:middleware 指令:

php artisan make:middleware CheckAge

會在 app/Http/Middleware 目錄下創建 CheckAge.php 的檔案。

檔案中,我們可以寫上檢查年齡的需求

<?php

namespace App\\Http\\Middleware;

use Closure;

class CheckAge
{
    public function handle(Request $request, Closure $next): Response
    {
        // 假設我們從請求中獲取年齡
        if ($request->age < 18) {
		        // 若年齡小於 18,重定向到 home 頁面
            return redirect('home');
        }
				// 如果年齡符合要求,則繼續請求
        return $next($request);
    }
}


Registering Middleware

Global Middleware

如果希望 Middleware 在每個 HTTP 請求期間都運行,可以在 bootstrap/app.php 文件中使用 withMiddleware 方法來註冊:

use App\Http\Middleware\CheckAge;

$app->withMiddleware(function (Middleware $middleware) {
    $middleware->append(CheckAge::class);
});

補充 prepend 方法註冊與 append 方法註冊

假設我們有三個Middleware A、B 和 C,我們可以這樣使用 prepend()append() 方法來控制它們的運行順序:

  • Middleware A → 使用 prepend() 方法註冊,這樣它會放在最前面運行。
  • Middleware B → 是直接放在中間。
  • Middleware C → 使用 append() 方法註冊,這樣它會放在最後面運行。

這樣的運行順序會是:
Middleware A(最先運行)→ Middleware B(其次運行)→ Middleware C(最後運行)

Middleware Groups

如果你有多個 Middleware 想一起使用,可以將它們分組。

bootstrap/app.php 中使用 withMiddleware 方法來註冊 Global Middleware,並使用 appendToGroup 方法將 Middleware 添加到已存在的群組中。

use App\Http\Middleware\CheckAge;
use App\Http\Middleware\First;
use App\Http\Middleware\Second;

$app->withMiddleware(function (Illuminate\Foundation\Http\Middleware $middleware) {
    // 將 CheckAge 中介軟體添加到 web 群組
    $middleware->appendToGroup('web', [
        CheckAge::class,
    ]);
    
    // 將多個中介軟體添加到 group-name 群組
    $middleware->appendToGroup('group-name', [
        First::class,
        Second::class,
    ]);
});

Assigning Middleware to Routes

將 Middleware 指派給特定 routes ,可以使用 middleware() 方法:

Route::get('/profile', function () {
    // ...
})->middleware('checkAge');

參考資料:

  1. How to Register Middleware in Laravel 11
  2. Formation Laravel : Middlewares
  3. Laravl官方網站 - Middleware

踏著身心靈的塔羅腳步,轉向技術與邏輯的工程師之路,就藉由塔羅日抽來紀錄今日的學習與生活吧!
教皇:多與人討論、詢問,都是能通往更好的道路唷!

"Everyone falls down. Getting back up is how you learn how to walk."

每個人都會跌倒,但重新振起來是學習繼續向前的方式。

Walt Disney


上一篇
Day17 - 探索 Laravel 的視覺魔法:使用 Blade 的佈局與繼承
下一篇
Day19 - Laravel Request 的力量:簡化 HTTP 請求處理
系列文
Laravel 隨筆學習札記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言